òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/13324

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

'''
˼·
ѡΪͬ600085
ѡȡĵ7һΪѵѵ֧ģ
ѵıǩǺ5յǵ˾1˾0
ÿе,ģͽδ5ǵԤ⣬Ϊ1ʱ룬ղ
ѡȡֵΪ
̼/̼۾ֵ
/
߼/߼۾ֵ
ͼ/ͼ۾ֵ
ɽֵǰһգ

׼
ע⣺
ʾֻΪ˵˼·÷ֵٲͳһĵһ⣬ԿҪٴλϸΪϸ
'''
from sklearn import svm
import numpy as np

#ʼ
def initialize(context):
    #ñ
    g.stock = '600085.XSHG'
    #û׼
    set_benchmark(g.stock)
    #˵orderϵAPIıerror͵log
    log.set_level('order', 'error')
    #ݳ
    g.days = 22
    #öʱ
    run_weekly(trade_func,3, time='open')
#ʱ
def trade_func(context):
    prediction = svm_prediction(context)
    if prediction == 1:
        cash  = context.portfolio.total_value
        order_target_value(g.stock,cash)
    else:
        order_target_value(g.stock,0)
        
#Ԥ
def svm_prediction(context):
    #ȡĵʷ
    stock_data = get_price(g.stock, frequency='1d',end_date=context.previous_date,count=252)
    date_value = stock_data.index
    close = stock_data['close'].values
    #ڼ¼ڵб
    date_list = []
    # ȡб
    #תڸʽ
    for i in range(len(date_value)):
        date_list.append(str(date_value[i])[0:10])
    
    x_all = []
    y_all = []
    #ȡx
    for i in date_list[g.days:-5]:
        features_temp = get_features(context,date=i,count=g.days)
        x_all.append(features_temp)
    #ȡy  
    for i in range(g.days,len(date_list)-5):    
        if close[i+5]>close[i]:
            label = 1
        else:
            label = 0    
        y_all.append(label)
    x_train = x_all[: -1]
    y_train = y_all[:-1]
    clf = svm.SVC()
    clf.fit(x_train, y_train)
    print('ѵ!')
    #Ԥ
    prediction = clf.predict(x_all[-1])[0]
    return prediction
    
#ȡֵ
def get_features(context,date,count=252):
    #ȡ
    df_price = get_price(g.stock,end_date=date,count=count,fields=['open','close','low','high','volume','money','avg','pre_close'])  
    close = df_price['close'].values
    low = df_price['low'].values
    high = df_price['high'].values
    volume = df_price['volume'].values
    #
    #̼/ֵ
    close_mean = close[-1]/np.mean(close)
    #/
    volume_mean = volume[-1]/np.mean(volume)
    #߼/
    high_mean = high[-1]/np.mean(high)
    #ͼ/
    low_mean = low[-1]/np.mean(low)
    #ɽֵǰһգ
    volume_current = volume[-1]/volume[0]
    #
    returns = close[-1]/close[0]
    #׼
    std = np.std(np.array(close),axis=0)   
    features = [close_mean,volume_mean,high_mean,low_mean,volume_current,returns,std]
    
    return features
    